#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
AI营销方案生成系统 - 规则模板模型
提供规则模板的数据模型和数据访问对象

主要功能：
- 规则模板数据模型
- 模板验证和序列化
- 模板数据访问对象
- 模板管理操作

设计原则：
- 灵活性：支持动态模板配置
- 可扩展性：支持模板字段扩展
- 数据完整性：确保模板数据一致性
- 性能优化：合理使用索引

Author: AI Marketing System
Date: 2024
"""

from typing import Dict, Any, List, Optional
from datetime import datetime, timezone
from pymongo.database import Database
from pymongo import ASCENDING, DESCENDING, TEXT

from .base import BaseModel, BaseDAO


class Template(BaseModel):
    """
    规则模板模型
    
    字段说明：
    - template_name: 模板名称
    - template_content: 模板内容（提示词模板）
    """
    
    collection_name = 'rule_templates'
    
    required_fields = [
        'template_name',
        'template_content'
    ]
    
    optional_fields = []
    
    default_values = {}
    
    def _custom_validate(self) -> List[str]:
        """
        自定义验证逻辑
        
        Returns:
            List[str]: 错误列表
        """
        errors = []
        
        # 验证模板名称
        if hasattr(self, 'template_name') and self.template_name:
            if len(self.template_name.strip()) < 2:
                errors.append("模板名称长度不能少于2个字符")
            if len(self.template_name) > 100:
                errors.append("模板名称长度不能超过100个字符")
        
        # 验证模板内容
        if hasattr(self, 'template_content') and self.template_content:
            if len(self.template_content.strip()) < 10:
                errors.append("模板内容不能少于10个字符")
            if len(self.template_content) > 50000:
                errors.append("模板内容不能超过50000个字符")
        
        return errors
    
    def render_prompt(self, variables: Dict[str, Any]) -> str:
        """
        渲染提示词模板
        
        Args:
            variables: 模板变量
            
        Returns:
            str: 渲染后的提示词
        """
        if not hasattr(self, 'template_content') or not self.template_content:
            return ""
        
        try:
            # 简单的字符串替换渲染
            rendered = self.template_content
            for key, value in variables.items():
                placeholder = f"{{{key}}}"
                rendered = rendered.replace(placeholder, str(value))
            
            return rendered
        except Exception as e:
            raise ValueError(f"模板渲染失败: {str(e)}")



class TemplateDAO(BaseDAO):
    """
    规则模板数据访问对象
    
    提供模板相关的基本数据库操作
    """
    
    @property
    def collection_name(self) -> str:
        return 'templates'
    
    @property
    def model_class(self):
        return Template
    
    def find_by_name(self, name: str) -> Optional[Template]:
        """
        根据名称查找模板
        
        Args:
            name: 模板名称
            
        Returns:
            Optional[Template]: 模板实例或None
        """
        return self.find_one({'template_name': name})